s->vram_shadow = (uint8_t *)((long)(s->vram_shadow + TARGET_PAGE_SIZE - 1)
& ~(TARGET_PAGE_SIZE - 1));
- s->vram_ptr = qemu_malloc(vga_ram_size);
+ /* Video RAM must be 128-bit aligned for SSE optimizations later */
+ s->vram_alloc = qemu_malloc(vga_ram_size + 15);
+ s->vram_ptr = (uint8_t *)((long)(s->vram_alloc + 15) & ~15L);
+
s->vram_offset = vga_ram_offset;
s->vram_size = vga_ram_size;
s->ds = ds;
}
if (!vga_ram_base) {
- vga_ram_base = qemu_malloc(vga_ram_size);
+ vga_ram_base = qemu_malloc(vga_ram_size + TARGET_PAGE_SIZE + 1);
if (!vga_ram_base) {
fprintf(stderr, "reallocate error\n");
return NULL;
}
/* XXX lock needed? */
+ old_pointer = s->vram_alloc;
+ s->vram_alloc = vga_ram_base;
+ vga_ram_base = (uint8_t *)((long)(vga_ram_base + 15) & ~15L);
memcpy(vga_ram_base, s->vram_ptr, vga_ram_size);
- old_pointer = s->vram_ptr;
s->vram_ptr = vga_ram_base;
return old_pointer;